//
// Created by Asus on 2025/5/14.
//

#include <iostream>
#include <memory>
#include <bits/ostream.tcc>
using namespace std;

// 1. C++ Null 指针
void demo01() {
    // 初始化指针为nullptr（C++11及以后推荐）
    int *ptr = nullptr;

    // 传统写法（等价于nullptr）
    // int* ptr = 0;
    // int* ptr = NULL;  // 需要包含<cstddef>头文件

    if (ptr == nullptr) {
        cout << "指针为空！" << endl; // 输出此句
    }

    // 解引用空指针会导致未定义行为（崩溃）
    // *ptr = 10;  // 错误！
}

// 2. 指针的算术运算
void demo02() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr;

    cout << "ptr 指向: " << *ptr << endl;
    cout << "ptr+1 指向: " << *(ptr + 1) << endl;

    ptr++;
    cout << "递增后 ptr 指向: " << *ptr << endl;

    int *ptr2 = &arr[3];
    cout << "ptr2 - ptr = " << (ptr2 - ptr) << endl;
}

// 3. 指针 vs 数组
void demo03() {
    int arr[5] = {1, 2, 3, 4, 5};

    // 数组名隐式转换为指针
    int *ptr = arr;
    cout << "arr[2] = " << arr[2] << endl; // 输出：3
    cout << "ptr[2] = " << ptr[2] << endl; // 输出：3（指针可像数组一样使用）
    cout << "*(arr+2) = " << *(arr + 2) << endl; // 输出：3（数组名可像指针一样运算）

    // 数组大小与指针大小不同
    cout << "数组大小: " << sizeof(arr) << " 字节" << endl; // 输出：20（5*4）
    cout << "指针大小: " << sizeof(ptr) << " 字节" << endl; // 输出：8（64位系统）
}

// 4. 指针数组
void demo04() {
    int a = 10, b = 20, c = 30;
    int *ptrArray[3] = {&a, &b, &c};

    cout << "ptrArray[1] = " << *ptrArray[1] << endl;

    const char *names[3] = {"Alice", "Bob", "Charlie"};

    for (int i = 0; i < 3; i++) {
        cout << "names[" << i << "] = " << names[i] << endl;
    }
}

// 5. 指向指针的指针（多级指针）
void demo05() {
    int num = 10;
    int *ptr = &num;
    int **ptrPtr = &ptr;

    cout << "num = " << num << endl;
    cout << "ptr = " << *ptr << endl;
    cout << "ptr = " << &ptr << endl;
    cout << "ptrPtr = " << **ptrPtr << endl;

    **ptrPtr = 100;
    cout << "num = " << num << endl;
}

// 7. 从函数返回指针
// 返回静态数组的指针（不推荐，线程不安全）
int* getStaticArray() {
    static int arr[3] = {1, 2, 3};
    return arr;
}

// 返回动态分配的数组（需手动释放）
int* getDynamicArray() {
    int* arr = new int[3]{4, 5, 6};
    return arr;
}

void demo07() {
    int* staticPtr = getStaticArray();
    cout << "静态数组: ";
    for (int i = 0; i < 3; i++) {
        cout << staticPtr[i] << " ";
    }
    cout << endl;

    // 使用动态数组
    int* dynamicPtr = getDynamicArray();
    cout << "动态数组: ";
    for (int i = 0; i < 3; i++) {
        cout << dynamicPtr[i] << " ";
    }
    delete[] dynamicPtr;  // 必须释放内存
    cout << endl;
}

// 8. 现代替代方案（推荐使用智能指针）
unique_ptr<int[]> getSafeArray() {
    auto arr = make_unique<int[]>(3);
    arr[0] = 1;
    arr[1] = 2;
    arr[2] = 3;
    return arr;
}
void demo08() {
    auto arr = getSafeArray();
    cout << "安全数组: ";
    for (int i = 0; i < 3; i++) {
        cout << arr[i] << " ";
    }
    // 无需手动释放内存，safeArr离开作用域时自动释放
    cout << endl;
}


int main(char *argv[]) {
    // demo01();
    // demo02();
    // demo03();
    // demo04();
    // demo05();
    // demo07();
    demo08();
    char name_char = 'n';
    char *name_char2 = "name";
}
